﻿using System;
using System.Diagnostics;
using QScheduler.Job;
using Quartz;
using Quartz.Impl;
using Topshelf;

namespace QScheduler
{
    /// <summary>
    /// 在程序中运用时，注意防止程序的回收机制对Quartz.Net的回收。（可以配合Topshelf，做Windows服务，使用方便）
    /// PS:单独做成一个程序集，为了将组件独立开；而且不同于CacheBll,这里的服务几乎只会在程序开始时调用一次，所以不用添加到BLLSession中去
    /// </summary>
    public class QuartzBll
    {
        private static IScheduler Scheduler { get; set; }

        static QuartzBll()
        {
            //首先创建一个调度器(一个调度器可以控制多个作业)
            Scheduler = StdSchedulerFactory.GetDefaultScheduler();
            #region 手动配置Quartz.Net，不使用配置文件（方案一）

            //创建出来一个具体的作业
            IJobDetail job = JobBuilder.Create<ClearUselessCacheFile>()
                .WithIdentity("job1", "jobGroup1")
                .Build();

            //创建并配置触发器
            DateTimeOffset startTime = DateTime.Now;
            DateTimeOffset endTime = DateTime.Now.AddYears(100);
            ITrigger intervalTrigger = TriggerBuilder.Create()
                .WithIdentity("trigger1", "triggerGroup1")
                .StartAt(startTime)
                .EndAt(endTime)
                .WithSimpleSchedule(x => x.WithIntervalInSeconds(90).RepeatForever())
                .Build();

            ITrigger excuteTimeTrigger = TriggerBuilder.Create()
                .WithIdentity("trigger2", "triggerGroup1")
                .WithCronSchedule("0 0 9,16 * * ?")//这是指每天的9点和16点执行任务
                .Build();

            //加入作业调度器
            Scheduler.ScheduleJob(job, intervalTrigger);

            #endregion
            #region Topshelf调用Quartz.Net

            //HostFactory.Run(x =>//以Windows服务的形式创建一个作业（需要cmd下安装服务）
            //{
            //    x.Service<ServiceRunner>();

            //    x.SetDescription("Spring_Mvc_EF项目的windows服务");
            //    x.SetDisplayName("Spring_Mvc_EF服务");
            //    x.SetServiceName("Spring_Mvc_EF服务");

            //    x.EnablePauseAndContinue();
            //    Debug.Write("666666");
            //});

            #endregion
        }

        /// <summary>
        /// 开始所有作业
        /// </summary>
        public static bool Start()
        {
            Scheduler.Start();

            return true;
        }

        /// <summary>
        /// 结束所有作业
        /// </summary>
        public static bool Stop()
        {
            if (!Scheduler.IsShutdown)
            {
                Scheduler.Shutdown(false);
            }
            return true;
        }

        /// <summary>
        /// 暂停所有作业
        /// </summary>
        public static bool PauseAll()
        {
            Scheduler.PauseAll();
            return true;
        }

        /// <summary>
        /// 继续所有作业
        /// </summary>
        public static bool ContinueAll()
        {
            Scheduler.ResumeAll();
            return true;
        }
    }
}
